# Таймкоды к курсу "Функциональное программирование"

Общее оглавление курса тут: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Functional.md

## [Функции, лямбды (стрелочные функции), контексты, замыкания в JavaScript](https://youtu.be/pn5myCmpV2U)

- [00:00:00 Введение](https://youtu.be/pn5myCmpV2U?t=0)
- [00:11:22 Функция объявление (Declaration)](https://youtu.be/pn5myCmpV2U?t=682)
- [00:12:46 Функция выражение (Expression)](https://youtu.be/pn5myCmpV2U?t=766)
- [00:16:07 Лямбда-выражение (Lambda expression) или функция-стрелка (Arrow function)](https://youtu.be/pn5myCmpV2U?t=967)
- [00:16:43 Лямбда-функция (Lambda function)](https://youtu.be/pn5myCmpV2U?t=1003)
- [00:18:45 Область видимости (Scope)](https://youtu.be/pn5myCmpV2U?t=1125)
- [00:25:00 Функции, как абстракции](https://youtu.be/pn5myCmpV2U?t=1500)
- [00:26:43 Методы функции (name, length, toString( ) )](https://youtu.be/pn5myCmpV2U?t=1603)
- [00:31:26 Значения по умолчанию у функции](https://youtu.be/pn5myCmpV2U?t=1886)
- [00:36:46 Rest-оператор (...args)](https://youtu.be/pn5myCmpV2U?t=2206)
- [00:41:49 Способ определения функции, через new Function](https://youtu.be/pn5myCmpV2U?t=2509)
- [00:44:46 Функции внутри объекта](https://youtu.be/pn5myCmpV2U?t=2686)
- [00:50:42 Обращение к полям объекта из привязанной функции, через this](https://youtu.be/pn5myCmpV2U?t=3042)
- [00:55:24 История синтаксиса создания контекстов, через самовызывающиеся функции ( IIFE)](https://youtu.be/pn5myCmpV2U?t=3324)
- [00:58:30 Методы функции, наследуемой от объекта (call, apply)](https://youtu.be/pn5myCmpV2U?t=3510)
- [01:00:53 Комментирование функций](https://youtu.be/pn5myCmpV2U?t=3653)
- [01:01:27 Задание декомпозиции функции](https://youtu.be/pn5myCmpV2U?t=3687)
- [01:04:24 Замыкание: context](https://youtu.be/pn5myCmpV2U?t=3864)
- [01:08:41 Замыкание: chainning](https://youtu.be/pn5myCmpV2U?t=4121)
- [01:11:55 Замыкание: summator](https://youtu.be/pn5myCmpV2U?t=4315)
- [01:14:16 Замыкание: recursion](https://youtu.be/pn5myCmpV2U?t=4456)

## [Частичное применение и каррирование в JavaScript ( Partial application )](https://youtu.be/ND8KQ5xjk7o)

- [00:00:00 Замыкание](https://youtu.be/ND8KQ5xjk7o?t=0)
- [00:04:54 Лямбда- функция](https://youtu.be/ND8KQ5xjk7o?t=294)
- [00:06:06 Метод bind](https://youtu.be/ND8KQ5xjk7o?t=366)
- [00:08:30 Абстрагированный пример функции](https://youtu.be/ND8KQ5xjk7o?t=510)
- [00:13:42 Абстрагированный пример функции (расширение)](https://youtu.be/ND8KQ5xjk7o?t=822)
- [00:15:47 Неправильная реализация каррирования](https://youtu.be/ND8KQ5xjk7o?t=947)
- [00:22:22 Правильная реализация каррирования](https://youtu.be/ND8KQ5xjk7o?t=1342)
- [00:28:54 Правильная реализация каррирования (расширение)](https://youtu.be/ND8KQ5xjk7o?t=1734)
- [00:31:41 Функциональные абстракции (superposition)](https://youtu.be/ND8KQ5xjk7o?t=1901)
- [00:38:02 Функциональные абстракции, с сохранением выражений (composition)](https://youtu.be/ND8KQ5xjk7o?t=2282)
- [00:45:05 Композиция с 2 функциями](https://youtu.be/ND8KQ5xjk7o?t=2705)
- [00:46:05 Композиция с n - функциями, при помощи метода reduce](https://youtu.be/ND8KQ5xjk7o?t=2765)
- [00:51:25 Композиция с n - функциями, при помощи цикла](https://youtu.be/ND8KQ5xjk7o?t=3085)
- [00:54:29 Композиция с n - функциями, при помощи рекурсии](https://youtu.be/ND8KQ5xjk7o?t=3269)
- [00:57:40 Композиция асинхронных функций](https://youtu.be/ND8KQ5xjk7o?t=3460)
- [01:01:27 Обобщение](https://youtu.be/ND8KQ5xjk7o?t=3687)

## [Функции высшего порядка, колбеки, события на JavaScript (HigherOrderFunctions, callbacks, events)](https://youtu.be/1vqATwbGHnc)

- [00:00:00 Определение](https://youtu.be/1vqATwbGHnc?t=0)
- [00:02:03 Математическая функция](https://youtu.be/1vqATwbGHnc?t=123)
- [00:05:57 Функция обратного вызова (callback)](https://youtu.be/1vqATwbGHnc?t=357)
- [00:09:33 Замыкание](https://youtu.be/1vqATwbGHnc?t=573)
- [00:10:51 Цепочка вызовов](https://youtu.be/1vqATwbGHnc?t=651)
- [00:12:40 Сохранение кэша с помощью замыкания](https://youtu.be/1vqATwbGHnc?t=760)
- [00:18:29 Добавление функции поведение логирования](https://youtu.be/1vqATwbGHnc?t=1109)
- [00:21:45 Обобщение](https://youtu.be/1vqATwbGHnc?t=1305)
- [00:22:45 Сallback](https://youtu.be/1vqATwbGHnc?t=1365)
- [00:25:32 Сallback асинхронной функции считывание файла](https://youtu.be/1vqATwbGHnc?t=1532)
- [00:28:36 Сallback именованный](https://youtu.be/1vqATwbGHnc?t=1716)
- [00:33:01 Сallback-timer](https://youtu.be/1vqATwbGHnc?t=1981)
- [00:36:20 Сallback-timer-curry](https://youtu.be/1vqATwbGHnc?t=2180)
- [00:38:59 Listener](https://youtu.be/1vqATwbGHnc?t=2339)
- [00:41:10 Listener-timer](https://youtu.be/1vqATwbGHnc?t=2470)
- [00:46:59 Event](https://youtu.be/1vqATwbGHnc?t=2819)
- [00:53:45 Event-imitter](https://youtu.be/1vqATwbGHnc?t=3225)
- [00:57:48 Deferred object (отложенный объект)](https://youtu.be/1vqATwbGHnc?t=3468)
- [01:01:31 Errors](https://youtu.be/1vqATwbGHnc?t=3691)

## [Примеси, обертки, декораторы, мемоизация в JavaScript (Wrappers)](https://youtu.be/oRQ0kQr1N-U)

- [00:00:00 Синхронная функция-обертка](https://youtu.be/oRQ0kQr1N-U?t=0)
- [00:02:55 Синхронная универсальная функция-обертка](https://youtu.be/oRQ0kQr1N-U?t=175)
- [00:08:28 Асинхронная универсальная функция-обертка](https://youtu.be/oRQ0kQr1N-U?t=508)
- [00:15:50 Синхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/oRQ0kQr1N-U?t=950)
- [00:22:45 Асинхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/oRQ0kQr1N-U?t=1365)
- [00:25:38 Функция-обертка, которая ограничивает вызов функции до одного вызова (once)](https://youtu.be/oRQ0kQr1N-U?t=1538)
- [00:27:36 Функция-обертка, которая ограничивает вызов функции до n-го вызова (limit)](https://youtu.be/oRQ0kQr1N-U?t=1656)
- [00:29:50 Функция-обертка, которая отменяет вызов функции (cancel)](https://youtu.be/oRQ0kQr1N-U?t=1790)
- [00:32:29 Функция-обертка с методами timeout, limit, cancel](https://youtu.be/oRQ0kQr1N-U?t=1949)
- [00:39:03 Функция-обертка с методами timeout, limit, cancel (оптимизированная)](https://youtu.be/oRQ0kQr1N-U?t=2343)
- [00:42:28 Функция-обертка, которая ограничивает один вызов за 200 мс (throttle)](https://youtu.be/oRQ0kQr1N-U?t=2548)
- [00:45:47 Примесь поля через точку](https://youtu.be/oRQ0kQr1N-U?t=2747)
- [00:51:35 Примесь поля через функцию extend](https://youtu.be/oRQ0kQr1N-U?t=3095)
- [00:57:35 Примесь поля через object.assign( )](https://youtu.be/oRQ0kQr1N-U?t=3455)
- [00:59:18 Примесь поведения](https://youtu.be/oRQ0kQr1N-U?t=3558)
- [01:02:23 Примесь изменения класса](https://youtu.be/oRQ0kQr1N-U?t=3743)
- [01:06:50 Определение](https://youtu.be/oRQ0kQr1N-U?t=4010)
- [01:07:30 Реализация простой мемоизации](https://youtu.be/oRQ0kQr1N-U?t=4050)
- [01:14:43 Реализация простой мемоизации с проверкой скорости](https://youtu.be/oRQ0kQr1N-U?t=4483)
- [01:20:43 Удаление накопленного кэша](https://youtu.be/oRQ0kQr1N-U?t=4843)
- [01:25:35 Асинхронная мемоизация](https://youtu.be/oRQ0kQr1N-U?t=5135)
- [01:31:10 Преобразование аргументов и ключей в hash-функцию](https://youtu.be/oRQ0kQr1N-U?t=5470)
- [01:33:32 Реализация сложной мемоизации](https://youtu.be/oRQ0kQr1N-U?t=5612)

## [Чеининг функций и объектов, обработка ошибок в JavaScript](https://youtu.be/PfuEfIiLX34)

- [00:00:00 Введение](https://youtu.be/PfuEfIiLX34?t=0)
- [00:01:10 Чеининг через синтаксис вызова функций](https://youtu.be/PfuEfIiLX34?t=70)
- [00:02:12 Prototype](https://youtu.be/PfuEfIiLX34?t=132)
- [00:05:45 Сlass](https://youtu.be/PfuEfIiLX34?t=345)
- [00:06:11 Functor](https://youtu.be/PfuEfIiLX34?t=371)
- [00:11:54 Mutable](https://youtu.be/PfuEfIiLX34?t=714)
- [00:16:34 Iterator](https://youtu.be/PfuEfIiLX34?t=994)
- [00:26:18 Promise](https://youtu.be/PfuEfIiLX34?t=1578)
- [00:26:35 Test](https://youtu.be/PfuEfIiLX34?t=1595)
- [00:37:08 Compare](https://youtu.be/PfuEfIiLX34?t=2228)
- [00:39:45 Benchmark](https://youtu.be/PfuEfIiLX34?t=2385)
- [00:40:48 Запуск и анализ тестов](https://youtu.be/PfuEfIiLX34?t=2448)
- [01:03:48 Первый способ возвращение ошибок в синхронном коде](https://youtu.be/PfuEfIiLX34?t=3828)
- [01:09:24 Второй способ возвращение ошибок в синхронном коде](https://youtu.be/PfuEfIiLX34?t=4164)
- [01:12:26 Возвращение ошибок в асинхронном коде](https://youtu.be/PfuEfIiLX34?t=4346)
- [01:16:14 Корректное возвращение ошибок](https://youtu.be/PfuEfIiLX34?t=4574)
- [01:20:03 Обработка ошибок c promise](https://youtu.be/PfuEfIiLX34?t=4803)
- [01:23:58 Обработка ошибок c async-await](https://youtu.be/PfuEfIiLX34?t=5038)

## [Функциональное программирование на JavaScript](https://youtu.be/0JxSs_GcvbQ)


## [Функциональные объекты, функторы и монады в JavaScript](https://youtu.be/3Z7f0Gi8pxw)

- [00:00:00 Определение функтора](https://youtu.be/3Z7f0Gi8pxw?t=0)
- [00:01:40 Функтор из прототипа](https://youtu.be/3Z7f0Gi8pxw?t=100)
- [00:08:17 Функтор из прототипа (упрощенный)](https://youtu.be/3Z7f0Gi8pxw?t=497)
- [00:09:14 Функтор из замыкания](https://youtu.be/3Z7f0Gi8pxw?t=554)
- [00:11:49 Функтор из замыкания с тернарным оператором](https://youtu.be/3Z7f0Gi8pxw?t=709)
- [00:12:44 Аппликативный функтор из прототипа](https://youtu.be/3Z7f0Gi8pxw?t=764)
- [00:18:08 Аппликативный функтор из замыкания (монада)](https://youtu.be/3Z7f0Gi8pxw?t=1088)
- [00:23:11 Пример применения монады](https://youtu.be/3Z7f0Gi8pxw?t=1391)
- [00:28:37 Функциональный объект](https://youtu.be/3Z7f0Gi8pxw?t=1717)
- [00:39:44 Пример применения функционального объекта](https://youtu.be/3Z7f0Gi8pxw?t=2384)
- [00:45:27 Обобщение](https://youtu.be/3Z7f0Gi8pxw?t=2727)

## [Отмена асинхронных операций, cancellable callback and Promise в JavaScript](https://youtu.be/T8fXlnqI4Ws)


## [Future: Асинхронность на фьючерах без состояния](https://youtu.be/22ONv3AGXdk)


## [Примеси, обертки, декораторы, мемоизация](https://youtu.be/2h9syXN5wO0)

- [00:00:00 Синхронная функция-обертка](https://youtu.be/2h9syXN5wO0?t=0)
- [00:02:55 Синхронная универсальная функция-обертка](https://youtu.be/2h9syXN5wO0?t=175)
- [00:08:28 Асинхронная универсальная функция-обертка](https://youtu.be/2h9syXN5wO0?t=508)
- [00:15:50 Синхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/2h9syXN5wO0?t=950)
- [00:22:45 Асинхронная функция-обертка, которая добавляет поведение (timeout)](https://youtu.be/2h9syXN5wO0?t=1365)
- [00:25:38 Функция-обертка, которая ограничивает вызов функции до одного вызова (once)](https://youtu.be/2h9syXN5wO0?t=1538)
- [00:27:36 Функция-обертка, которая ограничивает вызов функции до n-го вызова (limit)](https://youtu.be/2h9syXN5wO0?t=1656)
- [00:29:50 Функция-обертка, которая отменяет вызов функции (cancel)](https://youtu.be/2h9syXN5wO0?t=1790)
- [00:32:29 Функция-обертка с методами timeout, limit, cancel](https://youtu.be/2h9syXN5wO0?t=1949)
- [00:39:03 Функция-обертка с методами timeout, limit, cancel (оптимизированная)](https://youtu.be/2h9syXN5wO0?t=2343)
- [00:42:28 Функция-обертка, которая ограничивает один вызов за 200 мс (throttle)](https://youtu.be/2h9syXN5wO0?t=2548)
- [00:45:47 Примесь поля через точку](https://youtu.be/2h9syXN5wO0?t=2747)
- [00:51:35 Примесь поля через функцию extend](https://youtu.be/2h9syXN5wO0?t=3095)
- [00:57:35 Примесь поля через object.assign( )](https://youtu.be/2h9syXN5wO0?t=3455)
- [00:59:18 Примесь поведения](https://youtu.be/2h9syXN5wO0?t=3558)
- [01:02:23 Примесь изменения класса](https://youtu.be/2h9syXN5wO0?t=3743)
- [01:06:50 Определение](https://youtu.be/2h9syXN5wO0?t=4010)
- [01:07:30 Реализация простой мемоизации](https://youtu.be/2h9syXN5wO0?t=4050)
- [01:14:43 Реализация простой мемоизации с проверкой скорости](https://youtu.be/2h9syXN5wO0?t=4483)
- [01:20:43 Удаление накопленного кэша](https://youtu.be/2h9syXN5wO0?t=4843)
- [01:25:35 Асинхронная мемоизация](https://youtu.be/2h9syXN5wO0?t=5135)
- [01:31:10 Преобразование аргументов и ключей в hash-функцию](https://youtu.be/2h9syXN5wO0?t=5470)
- [01:33:32 Реализация сложной мемоизации](https://youtu.be/2h9syXN5wO0?t=5612)

## [Мемоизация функций: memoize в JavaScript](https://youtu.be/H6S8QJo2Qxg)


## [Композиция функций (pipe, compose) в JavaScript](https://youtu.be/xS9FicVrOTI)
